package com.li.onjava8.concurrent.es;


import com.li.onjava8.concurrent.es.task.NapTask;
import com.li.onjava8.concurrent.utils.Nap;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.stream.IntStream;

/**
 * @author li
 * @date 2023/10/30 13:59
 */
public class SingleThreadExecutor {
    public static void main(String[] args) {
        //创建任务并将它们提交给ExecutorService, 它们开始自己运行。然而，在此期间，main()继续做事
        ExecutorService es = Executors.newSingleThreadExecutor();
        IntStream.range(0, 10)
                .mapToObj(NapTask::new)
                .forEach(es::execute);

        //shutdown: 之前提交的任务将被执行，但不会接受新的任务。
        es.shutdown();

        //shutdownNow: 除了不接受新任务外，还会尝试通过中断任务来停止任何当前正在运行的任务。同样，中断是错误的，容易出错并且不鼓励。
//        es.shutdownNow();
        System.out.println("All task submitted");

        //一旦 es.shutdown()，再尝试提交新任务将抛出RejectedExecutionException。
//        es.execute(new NapTask(11));

        //此时，这些任务仍然在运行，因此我们必须等到它们在退出main()之前完成。这是通过检查exec.isTerminated()来实现的，这在所有任务完成后变为true。
        while (!es.isTerminated()) {
            System.out.println(Thread.currentThread().getName() + " awaiting termination");
            new Nap(0.1);
        }
    }
}
